闲扯
我发现自己的思路出现了严重的偏差。。。
想了两个假算法,都是代码打完发现有问题。。
题面
Solution
本题要解决的问题:将一条边的权值变为 $0$ ,使得所有路径长度的最大值最小。
我们考虑当 $x$ 满足条件时,所有比 $x$ 的也一定满足,即答案具有单调性,所以我们可以用二分答案。
现在我们将求解问题变为了判定性问题,理论上来说实现难度是要小一些的。
考虑怎么判断可行。
对于当前的判定值 $x$ ,所有长度大于 $x$ 的路径必须被处理掉。
因为只能清空一条边,所以我们选择的边一定属于所有这样的路径。
根据贪心的思想,我们取所有的满足条件的边中长度最大的一条。
如果最长路径的长度减去我们所选边的长度依旧大于 $x$ ,说明 $x$ 不合法,否则一定可以确定合法。
现在的问题就只剩下怎么判定一条边是否属于所有的长度大于 $x$ 的路径。
朴素的想法是对于每一个长度大于 $x$ 的路径,我们将路径上的所有边标记一次。
最后被标记了 $m$ 次的( $m$ 为这种路径的个数)就是我们要找的边。
考虑优化。
对于树上路径的区间加,可以考虑差分。
$u,v$ 两点间的所有边的计数加 $1$ ,可以转化为 $c_u+1,c_v+1,c_{lca}-2$ 。其中 $c$ 为差分数组。
这里我们需要要到一个小技巧:将每一条边寄存在深度更深的那一个点上。可以证明除了根节点外,每个点刚好代表了一条边。
这样我们就将所有的问题都解决了,可以轻松 $A$ 题了
Code
1 |
|
总结
对于最大值最小,最小值最大这类问题要敏感一些,可以往二分这方面想。